package com.jms.web.mvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 处理器拦截器接口，用于在请求处理前后进行拦截处理
 */
public interface HandlerInterceptor {

    /**
     * 获取拦截器的执行顺序值
     * 数值越小，优先级越高，越先执行
     *
     * @return 拦截器的顺序值
     */
    int order();

    /**
     * 检查拦截器是否活动
     *
     * @param request  HTTP请求对象
     * @param response HTTP响应对象
     * @param handler  处理器对象
     * @return
     */
    boolean interceptAction(HttpServletRequest request, HttpServletResponse response, Object handler);

    /**
     * 预处理回调方法，在目标方法执行之前执行
     *
     * @param request  HTTP请求对象
     * @param response HTTP响应对象
     * @param handler  处理器对象
     * @return true表示继续执行后续拦截器和处理器，false表示中断执行
     */
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        return true;
    }

    /**
     * 后处理回调方法，在目标方法执行之后执行
     *
     * @param request     HTTP请求对象
     * @param response    HTTP响应对象
     * @param handler     处理器对象
     * @param returnValue 目标方法的返回值
     * @return 处理后的返回值
     */
    default Object postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Object returnValue) {
        return returnValue;
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    }
}
